<?php

declare(strict_types=1);

namespace Zms\Validate\Rule;

use Zms\Unit\Is;
use const FILTER_VALIDATE_EMAIL;

/**
 * 电子邮件验证类
 * 用于验证输入值是否为有效的电子邮件地址。
 */
class EmailValidate extends RuleAbstract
{
    /**
     * 默认错误消息
     * 当验证失败时，返回的错误信息模板。
     * @var string
     */
    protected $_error = '{label}不是有效的邮箱地址';

    /**
     * 验证电子邮件
     * 使用 PHP 的 `filter_var` 函数和 `FILTER_VALIDATE_EMAIL` 过滤器来验证电子邮件地址。
     * 如果输入值为空且 `_noSkipping` 属性为 `true`，则直接返回 `true`。
     *
     * @param mixed $value 输入值
     * @param string $label 验证名（用于错误信息中）
     * @return bool 验证结果
     */
    public function validate($value, string $label = ''): bool
    {
        // 确保输入值是字符串类型
        if (is_string($value)) {
            // 如果值为空且 `_noSkipping` 为 `true`，直接返回 `true`
            if (Is::empty($value) && $this->_noSkipping === true) {
                $this->_value = $value;
                return true;
            }

            // 使用 `filter_var` 和 `FILTER_VALIDATE_EMAIL` 验证电子邮件
            $state = filter_var($value, FILTER_VALIDATE_EMAIL);

            // 将原始值保存到 `_value` 属性中
            $this->_value = $value;

            // 如果验证通过，返回 `true`
            if ($state) return true;
        }

        // 如果验证失败，添加错误信息并返回 `false`
        $this->addError($this->_error, $label);
        return false;
    }
}
